#ifndef XLCOMM_NET_EVENTLOOPTHREADPOOL_H_
#define XLCOMM_NET_EVENTLOOPTHREADPOOL_H_

#include <functional>
#include <memory>
#include <string>

#include "xlcomm/net/event_loop.h"
#include "xlcomm/net/event_loop_thread.h"
#include "xlcomm/noncopyable.h"

namespace xlcomm {
namespace net {

// IO事件循环线程池。必须需要在base_loop线程调用
class EventLoopThreadPool : noncopyable {
 public:
  using ThreadInitCallback = std::function<void(EventLoop*)>;

  EventLoopThreadPool(EventLoop* base_loop, const std::string& name);
  ~EventLoopThreadPool();

  // 启动固定数量的EventLoop线程池
  void Start(int thread_num,
             const ThreadInitCallback& cb = ThreadInitCallback());

  // 获取下一个EventLoop指针（简单轮询）
  EventLoop* GetNextLoop();

  // 根据hash code获取EventLoop指针（相同hash code得到的一样）
  EventLoop* GetLoopForHash(uint64_t hash_code);

  // 获取所有EventLoop指针
  std::vector<EventLoop*> GetAllLoops();

  bool started() const { return started_; }
  const std::string& name() const { return name_; }

 private:
  EventLoop* base_loop_;
  std::string name_;
  ThreadInitCallback cb_;
  std::vector<EventLoop*> loops_;
  std::vector<std::unique_ptr<EventLoopThread>> loop_threads_;
  bool started_;
  size_t index_;
};

}  // namespace net
}  // namespace xlcomm

#endif  // XLCOMM_NET_EVENTLOOPTHREADPOOL_H_